package com.cskaoyan.javase.oop1._13block._4extend;
/**
 * 扩展——类加载和代码块的执行（了解）
 *
 * 在某个类的类初始化过程中，就能够创建某个的类对象了
 * 因为只需要经过加载和连接，JVM就足以了解该类型
 * 初始化的步骤就是为了执行static相关内容产生的步骤
 *
 * 这种语法既然不报错，说明：
 *      1.类初始化步骤完成之前，这个类就可以创建对象了。创建对象，不依赖于完成类加载（初始化）。
 *      2.某个类一旦开始进行初始化，就不会再重复进行一次初始化了！（因为类加载只有一次，本质是类初始化只有一次，触发类加载，本质是触发类初始化。）
 *
 * @since 09:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    // statics {
    //     System.out.println("Demo类开始初始化步骤了!");
    // }

    static Cat cat = new Cat();
    static {
            System.out.println("Demo类完成初始化步骤了!");
    }
    Dog dog = new Dog();

    public static void main(String[] args) {
        System.out.println("hello world!");
        Demo d = new Demo();
    }

    public Demo() {
        System.out.println("demo");
    }
}

class Cat {
    // statics {
    //     System.out.println("Cat类开始初始化步骤了!");
    // }

    static Dog dog = new Dog();
    static {
        System.out.println("Cat类完成初始化步骤了!");
    }

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    // statics {
    //     System.out.println("Dog类开始初始化步骤了!");
    // }

    static Demo demo = new Demo();
    static {
        System.out.println("Dog类完成初始化步骤了!");
    }

    public Dog() {
        System.out.println("dog");
    }
}

class A{
    static A a = new A();
}